package frsf.cidisi.exercise.laberinto.situationCalculus;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Scanner;

import frsf.cidisi.exercise.laberinto.situationCalculus.util.Celda;
import frsf.cidisi.exercise.laberinto.situationCalculus.util.Par;
import frsf.cidisi.faia.exceptions.PrologConnectorException;
import frsf.cidisi.faia.simulator.SituationCalculusBasedAgentSimulator;

public class AgenteLaberintoMain {
	
	static private int NIVELES = 3;
	private static int T = 10;
	private static int FILAS = T;
	private static int COLUMNAS = T;
	
	private static EstadoLaberinto[] laberintos = new EstadoLaberinto[NIVELES];
		
    /**
     * @param args
     * @throws PrologConnectorException
     */
    public static void main(String[] args) throws PrologConnectorException,IOException {
        init();
        AgenteLaberinto agent;
        Laberinto environment;
        SituationCalculusBasedAgentSimulator simulator;
        
        for(int i=1; i<=NIVELES; i++) {
        	System.out.print("Presione ENTER para continuar..");
        	java.util.Scanner pausa=new java.util.Scanner(System.in); pausa.nextLine();
        	agent = new AgenteLaberinto();
        	environment = new Laberinto();
        	environment.setEnvironmentState(laberintos[i-1]);
        	simulator = new SituationCalculusBasedAgentSimulator(environment, agent);
        	simulator.start();
        	agent.getAgentState().halt();
        }
        
   }
    
	private static void init() {

        try{
            // Abrimos el archivo
            FileInputStream fstream = new FileInputStream("./resources/laberintos" + T + "x" + T + ".txt");
            // Creamos el objeto de entrada
            DataInputStream entrada = new DataInputStream(fstream);
            // Creamos el Buffer de Lectura
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));
            String linea;
            
            for(int k=0; k<NIVELES; k++) {
            	laberintos[k] = new EstadoLaberinto(FILAS, COLUMNAS);
            	linea = buffer.readLine();
            	cargarEntradas(linea, k);
            	linea = buffer.readLine();
            	cargarSalidas(linea, k);
            	linea = buffer.readLine();
            	cargarLlaves(linea, k);
            	linea = buffer.readLine();
            	cargarCerrojos(linea, k);
            	linea = buffer.readLine();            	
            	if(linea.isEmpty()) //Comienzo de laberinto
            		
            		for(int i=0; i<FILAS; i++) {
            			linea = buffer.readLine();
        				if(linea.isEmpty())  //Comienzo de fila
        					
        					for(int j=0; j<COLUMNAS; j++) {
        						linea = buffer.readLine();
        						//System.out.println (linea);
        						cargarLaberinto(linea, k, i, j);        			
        					}
            		}
            }
            // Cerramos el archivo
            entrada.close();
        }catch (Exception e){ //Catch de excepciones
            System.err.println("Ocurrio un error: " + e.getMessage());
        }
	}
	
	private static void cargarLlaves(String linea, int nivel) {
		List<Par> llaves = laberintos[nivel].getEntorno().getLlaves();
		String pares[] = linea.split(" ");
		for(String pos : pares) {
			String par[] = pos.split(",");
			if(par.length == 2) {
				int x = Integer.parseInt(par[0]);
				int y = Integer.parseInt(par[1]);
				llaves.add(new Par(x, y));
			}
		}
	}
	
	private static void cargarEntradas(String linea, int nivel) {
		List<Par> entradas = laberintos[nivel].getEntorno().getEntradas();
		String pares[] = linea.split(" ");
		for(String pos : pares) {
			String par[] = pos.split(",");
			if(par.length == 2) {
				int x = Integer.parseInt(par[0]);
				int y = Integer.parseInt(par[1]);
				entradas.add(new Par(x, y));
			}
		}
	}
	
	private static void cargarSalidas(String linea, int nivel) {
		List<Par> salidas = laberintos[nivel].getEntorno().getSalidas();
		String pares[] = linea.split(" ");
		for(String pos : pares) {
			String par[] = pos.split(",");
			if(par.length == 2) {
				int x = Integer.parseInt(par[0]);
				int y = Integer.parseInt(par[1]);
				salidas.add(new Par(x, y));
			}
		}
	}
	
	private static void cargarCerrojos(String linea, int nivel) {
		List<Par> cerrojos = laberintos[nivel].getEntorno().getCerrojos();
		String pares[] = linea.split(" ");
		for(String pos : pares) {
			String par[] = pos.split(",");
			if(par.length == 2) {
				int x = Integer.parseInt(par[0]);
				int y = Integer.parseInt(par[1]);
				cerrojos.add(new Par(x, y));
			}
		}
	}
	
	private static void cargarLaberinto(String linea, int nivel, int x, int y) {
		String numeros[] = linea.split(" ");
		if (numeros.length == 4) {
			int[] estados = new int[4];
			for(int i = 0; i < numeros.length; i++)
				estados[i] = Integer.parseInt(numeros[i]);
			Celda celda = new Celda(estados);
			laberintos[nivel].getEntorno().setCelda(celda, x, y);
		}
	}	
}
